package com.chinact.concurrent.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 【线程不安全的】
 * <p>
 * CountDownLatch作用：同步功能的辅助类，初始化时传入一个int类型的count值，当count计数不为0时，则当前线程呈wait状态，如果为0，则继续执行。
 */
public class CountDownLatchDemo1 {
	// 定义线程数
	public static int clientTotal = 5000;
	// 定义并发数
	public static int theadTotal = 200;
	// 定义一个计数器，用于累加计算
	public static int count = 0;

	/**
	 * 模拟并发操作
	 * <p>
	 * 注意，这个测试是线程不安全的，所以count求和不一定是5000
	 */
	public static void main(String[] args) throws InterruptedException {
		// 定义一个线程池
		ExecutorService executorService = Executors.newCachedThreadPool();
		// 定义一个计数信号量
		Semaphore semaphore = new Semaphore(theadTotal);
		// 定义一个计数器闭锁
		CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
		for (int i = 0; i < clientTotal; i++) {
			executorService.execute(() -> {
				try {
					// 获取许可
					semaphore.acquire();
					// 当Semaphore达到theadTotal最大量的时候，add方法可能被阻塞
					add();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					// 访问完后，释放
					semaphore.release();
				}
				// 计数减1
				countDownLatch.countDown();
			});
		}
		// 判断count是否为0，如果不为0则等待
		countDownLatch.await();
		// 关闭线程池
		executorService.shutdown();
		System.out.println(" ======= " + count);
	}

	/**
	 * 简单的加法运算
	 */
	private static void add() {
		count++;
	}
}
